#include <iostream>
#include <string.h>
#include <unistd.h>
#include "ShareMemory.hpp"
#include "Time.hpp"
#include "Fifo.hpp"


int main()
{
    std::cout << "time: " << GetCurrTime() << std::endl;
    std::cout << "self pid: " << getpid() << std::endl;

    //std::cout << "time: " << GetCurrTime() << std::endl; 
    shm.CreateShm();
    shm.AttachShm();

    shm.ShmMeta();

    // gpipe.OpenPipeForRead();

    // sleep(10);
    // std::cout << "Server attach done" << std::endl;
    
    //sleep(10);

    // 在这里进行IPC
    // char *strinfo = (char*)shm.GetAddr();
    // printf("Server虚拟地址：%p\n", strinfo);

    // 若共享资源被保护起来了，访问公共资源的代码 ---- 临界区
    // while(true)
    // {
    //     printf("%s\n", strinfo);
    //     sleep(1);
    // }

    // 把共享内存当做一个结构体
    struct data *image = (struct data*)shm.GetAddr();
    
    // while(true)
    // {
    //     // gpipe.wait();// 等待写入完成，再输出
        
    //     printf("status: %s\n", image->status);
    //     printf("lasttime: %s\n", image->lasttime);
    //     printf("image: %s\n", image->image);
    //     strcpy(image->status, "过期");

    //     //sleep(5);
    // }


    // sleep(10);

    shm.DetachShm();
    // std::cout << "Server detach done" << std::endl;
    // sleep(10);
    shm.DeleteShm();
    // std::cout << "delete shm" << std::endl;

    return 0;
}

// int main()
// {
//     // 1. 创建 key
//     key_t k = ::ftok(gpath.c_str(), gprojID);
//     if(k < 0)
//     {
//         std::cerr << "fork error" << std::endl;
//         return 1;
//     }
//     std::cout << "k : " << ToHex(k) << std::endl;

//     // 2. 创建共享内存 && 获取
//     // 注意：共享内存也有权限！
//     int shmid = ::shmget(k, gshmsize, IPC_CREAT | IPC_EXCL | gmode);
//     if(shmid < 0)
//     {
//         std::cout << "shmget error" << std::endl;
//         return 2;
//     }
//     std::cout << "shmid : " << shmid << std::endl;

//     sleep(5);

//     // 3. 共享内存挂接到自己的地址空间中
//     void *ret = shmat(shmid, nullptr, 0);
//     std::cout << "attach done:" << (long long)ret << std::endl;

//     sleep(5);

//     // 4. 将共享内存段与当前进程脱离
//     ::shmdt(ret);
//     std::cout << "detach done: "  << std::endl;

//     sleep(5);

//     // 在这里进行通信

//     // n. 删除共享内存
//     shmctl(shmid, IPC_RMID, nullptr);
//     std::cout << "delete shm done" << std::endl;

//     sleep(5);

//     return 0;
// }